import { store, widget, graphicLayer, map, mars3d } from "@/utils/global";
import { ElMessage } from "element-plus";
import { querySearchAsync } from "@/utils/topwidget/topwidget";
interface Query {
    baseId?: string;
    token?: string;
    teamName?: string;
    addr?: string;
    origin?: string;
    lng?: string;
    lat?: string;
    editor?: boolean;
    baseName?: string;
}
// 获取到url参数
const getUrlParam = () => {
    let url: string = window.location.href;
    const Params: Query = {};
    if (url.indexOf("?") > 0) {
        //判断是否有qurey
        let parmas = url.slice(url.indexOf("?") + 1); //截取出query
        const paramlists = parmas.split("&"); //分割键值对
        for (const param of paramlists) {
            let a = param.split("=");
            Object.assign(Params, { [a[0]]: a[1] }); //将键值对封装成对象
        }
    }
    return Params;
};
/**
 * 地址加载
 * @param graphicLayer 图层
 * @param callBack 回调函数
 */
export const addrLoading = (callBack: Function) => {
    let params: Query = getUrlParam();
    console.log(params);
    if (Object.getOwnPropertyNames(params).length !== 0) {
        // console.log(params);
        // 获取到路由参数
        if (params.baseId || params.token) {
            if (params.baseId && params.token) {
                // 接收的是baseId和token
                loadingCompleted(params);
                callBack();
            } else {
                ElMessage.error("获取基地ID和用户数据失败!");
            }
        } else {
            if (params.teamName || params.origin || params.addr || params.lng || params.lat || (!params.baseId && !params.token)) {
                addrMessage(params);
            } else {
                ElMessage.error("获取地址信息失败!");
            }
        }
    } else {
        ElMessage.error("获取基地ID和用户数据失败!");
    }
};
// topwidget: {
//     coverage: false, // 图层控件按钮开关
//     search: false, // 搜索控件按钮开关
//     back: false, // 返回控件按钮开关
//     tool: false, // 工具控件按钮开关
//     sign: false, // 标记地图控件按钮开关
// },
/**
 * 获取到baseId后，地图完成最终加载
 * @param baseId 基地id
 */
const loadingCompleted = (params: Query) => {
    // 获取到baseId
    store.baseId = params.baseId;
    store.token = params.token;
    if (params.baseName) {
        document.title = decodeURI(params.baseName);
    }

    // 地图加载完成后，显示图层控件按钮
    widget.topwidget.coverage = true;
    widget.topwidget.search = true;
    widget.topwidget.tool = true;
};
/**
 *  由主系统发送过来的地址信息
 */
const addrMessage = (params: Query) => {
    widget.topwidget.sign = true;
    // 如果接收的是汉字信息，需要进行解码
    if (params.addr && !params.lng && !params.lat) {
        console.log(decodeURIComponent(params.addr));
        querySearchAsync(decodeURIComponent(params.addr), (res: any) => {
            if (res.length > 0) {
                console.log(res[0]);
                // 飞图到相应位置
                map.flyToPoint([res[0].lng, res[0].lat, 500]);
            } else {
                ElMessage.error("未搜索到相关地址,请手动查找!");
            }
        });
    } else {
        // 如果接收到的是坐标
        map.flyToPoint([params.lng, params.lat, 500]);
        renderer([params.lng, params.lat], params);
    }
};
/**
 * 向地图添加标记
 */
export const signMaps = () => {
    graphicLayer.startDraw({
        type: "billboard",
        style: signStyle,
    });
    let params: Query = getUrlParam();
    addOpenMessage(params);
    monitor();
};
/**
 * 渲染
 */
const renderer = (coordinates: any, params: any) => {
    const graphic: any = new mars3d.graphic.BillboardEntity({
        position: coordinates,
        style: {
            image: "http://mars3d.cn/img/marker/mark-blue.png", // 用于矢量对象的 图像、URI或Canvas
            scale: 1, // 图像大小的比例
            rotationDegree: 0, // 旋转角度（度数值，0-360度），与rotation二选一
            scaleByDistance: false, // 是否按视距缩放 或 设定基于与相机的距离设置比例。
            scaleByDistance_far: 1000000, // 上限
            scaleByDistance_farValue: 0.1, // 上限比例值
            scaleByDistance_near: 1000, // 下限
            scaleByDistance_nearValue: 1, // 下限比例值
            distanceDisplayCondition: false, // 是否按视距显示 或 指定此框将显示在与摄像机的多大距离。
            distanceDisplayCondition_far: 100000, // 最大距离
            distanceDisplayCondition_near: 0, // 最小距离
            visibleDepth: false, // 是否被遮挡
            clampToGround: true, // 是否贴地
            isLabel: false, // 是否文字
        },
    } as any);
    addOpenMessage(params);
    graphicLayer.addGraphic(graphic);
    graphic.startEditing();
    monitor();

    widget.topwidget.sign = false;
};
/**
 * 添加展示信息
 */
const addOpenMessage = (params: any) => {
    graphicLayer.bindPopup(function (event: any) {
        const attr = event.graphic.attr || {};
        let addr = decodeURIComponent(params.addr);
        attr["地址"] = addr.includes("/") ? addr.split("/")[addr.split("/").length - 1] : addr;
        attr["经度"] = event.graphic.points[0].lng;
        attr["纬度"] = event.graphic.points[0].lat;
        // attr["海拔"] = event.graphic.points[0].alt
        attr["备注"] = "";

        return mars3d.Util.getTemplateHtml({
            title: decodeURIComponent(params.teamName),
            template: "all",
            attr,
        });
    });
};
/**
 * 标记样式
 */
const signStyle = {
    image: "http://mars3d.cn/img/marker/mark-blue.png", // 用于矢量对象的 图像、URI或Canvas
    scale: 1, // 图像大小的比例
    rotationDegree: 0, // 旋转角度（度数值，0-360度），与rotation二选一
    scaleByDistance: false, // 是否按视距缩放 或 设定基于与相机的距离设置比例。
    scaleByDistance_far: 1000000, // 上限
    scaleByDistance_farValue: 0.1, // 上限比例值
    scaleByDistance_near: 1000, // 下限
    scaleByDistance_nearValue: 1, // 下限比例值
    distanceDisplayCondition: false, // 是否按视距显示 或 指定此框将显示在与摄像机的多大距离。
    distanceDisplayCondition_far: 100000, // 最大距离
    distanceDisplayCondition_near: 0, // 最小距离
    visibleDepth: false, // 是否被遮挡
    clampToGround: true, // 是否贴地
    isLabel: false, // 是否文字
};
/**
 * 监听图层对象绘制情况
 */
const monitor = () => {
    const params: any = getUrlParam();
    graphicLayer
        .on(mars3d.EventType.drawCreated, (e: any) => {
            let objData = e.graphic;
            objData.startEditing();
            setTimeout(() => {
                console.log("准备发送消息", "创建", objData);
                window.parent.postMessage({ location: objData.points[0] }, params.origin);
                widget.topwidget.sign = false;
            }, 300);
        })
        .on(mars3d.EventType.editMovePoint, function (e: any) {
            // 修改
            let objData = e.graphic;
            setTimeout(() => {
                console.log("准备发送消息", "修改");
                window.parent.postMessage({ location: objData.points[0] }, params.origin);
            }, 300);
        });
};
